
#include <Arduino.h>
#include <vector>

#ifndef __HID_H__
#define __HID_H__

// 0x01	Num Lock	数字键盘锁定指示灯（通常用于键盘）。
// 0x02	Caps Lock	大写锁定指示灯。
// 0x03	Scroll Lock	滚动锁定指示灯。
// 0x04	Compose	字符组合指示灯（如输入法状态）。
// 0x05	Kana	日文假名输入模式指示灯（如日语键盘）。
// 0x06	Power	电源状态指示灯（如设备通电）。
// 0x07	Shift	Shift键状态指示灯（较少使用）。
// 0x08	Do Not Disturb	勿扰模式指示灯（如静音状态）。
// 0x09	Mute	静音状态指示灯（常见于音频设备）。
// 0x0A	Volume Up/Down	音量调节指示灯（通常配合其他字段使用）。
// 0x0B	Balance Left/Right	声道平衡指示灯（音频设备）。
// 0x0C	Bass Boost	低音增强指示灯。
// 0x0D	Treble Boost	高音增强指示灯。
/** PS/2只支持以下3个LED */
#define HID_LED_MSK_NUM_LOCK 0x01
#define HID_LED_MSK_CAPS_LOCK 0x02
#define HID_LED_MSK_SCSROLL_LOCK 0x04

// HID Report项数据结构
struct HIDReportItem {
    uint8_t type;       // 类型 (Input/Output/Feature)
    uint8_t reportId;   // 报告ID
    int32_t bitBegin;   // 起始位
    uint8_t bitSize;    // 位大小
    int32_t usageMin;   // 最小值
    int32_t usageMax;   // 最大值
    int32_t logicalMin; // 逻辑最小值
    int32_t logicalMax; // 逻辑最大值
    uint32_t usagePage; // 用途页
    uint32_t usage;     // 用途
};

/**
 * HID设备类
 */
class HID {
public:
    bool _bInit = false;          // 是否初始化成功
private:
    /** HID报表描述符 相关 */
    // 当前解析状态
    uint32_t currentUsagePage;
    uint32_t currentUsage = 0;
    uint32_t currentUsages[5] = {0}; // 收字节存放数组长度
    int32_t currentUsageMin = 0;
    int32_t currentUsageMax = 0;
    int32_t currentLogicalMin = 0;
    int32_t currentLogicalMax = 0;
    uint8_t currentBitSize = 0;
    uint8_t currentItemCount = 0;
    uint8_t currentReportId = 0;
    int32_t currentBitBeginInput = 0;
    int32_t currentBitBeginOutput = 0;
    int32_t currentBitBeginFeature = 0;
    // HID报表描述符分析结果
    std::vector<HIDReportItem> reportItems;

    int _type = 0;       //  (0:未知  1：键盘 2:鼠标)
    int _ReportSize = 0; //  报表长度

    // 分析HID报表描述符
    void analyzeReportDesc(uint8_t *data, size_t &offset, size_t length);
    // 获取Usage Page名称
    String getUsagePageName(uint32_t usagePage);
    // 获取Usage名称
    String getUsageName(uint32_t usagePage, uint32_t usage);

public:
    void destory();
    void init(uint8_t *pReportMap, size_t len);  // 根据HID报表描述符初始化

    // 打印解析的Report Map信息
    void printReportMapInfo();

    friend class HIDPS2conv_MS;
    friend class HIDPS2conv_KB;
};

#endif
